#ifndef CODEC
#define CODEC

#include "tools.h"
#include <mutex>
#include <vector>
namespace lcf
{
    // 编码和解码的基类
    class Codec
    {
    public:
        Codec() : context_(nullptr) {}
        ~Codec() {}

        /// 创建编解码上下文
        /// @para codec_id 编码器ID号，对应ffmpeg
        /// @return 编码上下文 ,失败返回nullptr
        static AVCodecContext *CreateContext(int codecId, bool isEncode);

        /// 设置对象的编码器上下文 上下文传递到对象中，资源由XEncode维护
        /// 加锁 线程安全
        /// @para c 编码器上下文 如果c_不为nullptr，则先清理资源
        void SetContext(AVCodecContext *context);

        /// 设置编码参数，线程安全
        bool SetOpt(const char *key, const char *val);
        bool SetOpt(const char *key, int val);

        /// 打开编码器 线程安全
        bool Open();

        virtual void Clear();

    protected:
        AVCodecContext *context_; // 编码器上下文
        std::mutex mtx_;          // 编码器上下文锁
    };
}

#endif